/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.utils;

import br.com.Enumeradores.PROCEDURES;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * Classe responsavel pelas açoes que do banco de dados
 *
 * @author Kevlin Toshinari Ossada - 30/01/2013 - kevlin.ossada@fatec.sp.gov.br
 */
public class UtilsMySQL {

    private static String status = "Não conectou...";
    private static UtilsMySQL instance;

    public static UtilsMySQL getInstance() {
        if (instance == null) {
            instance = new UtilsMySQL();
        }
        return instance;
    }

    /**
     * Requisita conexão com o banco de dados
     * 
     * @return Retorna conexao
     * 
     * @author Kevlin Toshinari Ossada - 30/01/2013 -
     * kevlin.ossada@fatec.sp.gov.br     
     */
    public static Connection getConexao() {
        Connection cnn = null;
        try {
            String driverName = "com.mysql.jdbc.Driver";
            Class.forName(driverName);

            String serverName = "localhost";    //caminho do servidor do BD
            String mydatabase = "bdSysCeci";        //nome do seu banco de dados
            String url;
            url = new StringBuilder().append("jdbc:mysql://").append(serverName).append("/").append(mydatabase).toString();
            String username = "root";        //nome de um usuário de seu BD      
            String password = "";      //sua senha de acesso            

            cnn = DriverManager.getConnection(url, username, password);

            if (cnn != null) {
                status = ("STATUS --> Conectado com sucesso!");
            } else {
                status = ("STATUS --> Não foi possivel realizar conexão!");
            }

            return cnn;
        } catch (ClassNotFoundException e) {
            status = new StringBuilder().append("O driver expecificado nao foi encontrado. Erro: ").append(e.getMessage()).toString();
            return null;
        } catch (SQLException e) {
            status = new StringBuilder().append("STATUS --> Nao foi possivel conectar ao Banco de Dados! Erro: ").append(e.getMessage()).toString();
            return null;
        }
    }

    public static String getStatus() {
        return status;
    }

    /**
     * Fecha conexao com banco de dados
     * @return sucesso
     * 
     * @author Kevlin Toshinari Ossada - 01/02/2013 -
     * kevlin.ossada@fatec.sp.gov.br 
     */
    public static boolean fecharConexao() {
        try {
            UtilsMySQL.getConexao().close();;
            status = ("Status --> Conexão encerrada!");
            return true;
        } catch (SQLException e) {
            status = new StringBuilder().append("Status --> Erro ao tentar encerrar conexão! Erro: ").append(e.getMessage()).toString();
            return false;
        }
    }

    /**
     * Monta Statement com chamada para procedure
     * 
     * @param proc Procedure que sera executada
     * 
     * @return retorna Statement montada com chamada para proc
     * 
     * @throws Exception excessão de falha ao tentar montar statement
     * 
     * @author Kevlin Toshinari Ossada - 01/02/2013 -
     * kevlin.ossada@fatec.sp.gov.br 
     */
    public static CallableStatement getProcStatement(PROCEDURES proc) throws Exception {
        StringBuilder str = new StringBuilder();
        str.append("{ call ");
        str.append(proc.getValor());
        str.append(" };");
        CallableStatement stm = null;
        try {
            stm = getConexao().prepareCall(str.toString());
        } catch (Exception e) {
            throw new Exception(new StringBuilder().append("\nErro no statement! Erro: ").append(e.getMessage()).toString());
        }
        return stm;
    }

}
